﻿# -*- coding: utf-8 -*-

# Django

from django import template
from django.conf import settings
from django.core.cache import cache

# Helper apps

from quicktags.templatetags.quick_tag import quick_tag
import navmenu
from navmenu.models import Menu, MenuItem

register = template.Library()

@register.tag
@quick_tag
def navmenu(context, menu_slug, template_dir = 'navmenu/ul', use_cache=True):
    """
    Render a navigation menu, it also caches the menu for perfomance issues

    Examples:
        {% load navmenu %}

        <ul>
        {% navmenu 'main' %}
        </ul>

        <ul class="second">
        {% navmenu 'second' %}
        </ul>

        /* for a comma-separated menu */
        <p class="inline-list">
            {% navmenu 'footermenu' 'navmenu/a' %}
        </ul>

    ***Note that the templatetag must be enclosed by a ul or other tag,
    
    For a different rendering, you can create new templates and pass them as template_dir parameter
    the directory must contain a navmenu (the grouper) and navitem (the menu item)

    Because of @quick_tag decorator, you can also pass named parameters like:
        {% navmenu use_cache=False %}
    """

    # Cache menu by its slug
    menukey = 'nav_%s%d' % (menu_slug,settings.SITE_ID)
    menu = use_cache and cache.get(menukey) or None
    first_level_items = None
    
    if not menu:
        menu = Menu.objects.filter(slug=menu_slug)[:1]
        if use_cache:
            cache.set(menukey,menu)

    if menu:
        menu = menu[0]
        # Adiciona o menu ao contexto global (o mesmo da view, com request e etc.)
        itemskey = 'navitems_%d' % menu.id
        first_level_items = use_cache and cache.get(itemskey) or None
        if not first_level_items:
            first_level_items = menu.items.all().filter(parent_item=None)
            if use_cache:
                cache.set(itemskey,first_level_items)

    c = template.Context({
        'menu': menu,
        'items': first_level_items,
        'template_dir': template_dir,
    })

    return template.loader.render_to_string('%s/navmenu.html' % template_dir, c)



@register.tag('navitem')
@quick_tag
def navitem(context, item, child=False):
    """
    Renderiza um item ou sub-item de menu com o template `navitem.html`
    dentro de `template_dir` definido na tag anterior `navmenu`.

    Exemplos:
        {% load navmenu %}
        {% navitem child %}
    """

    # Tenta capturar o endereço atual do request
    # Evita falha se o `django.core.context_processors.request` não estiver ativo
    try:
        path = context['request'].path
    except:
        path = None
    
    # Verifica se o caminho atual não é a raiz do site
    # e se começa com o link do item atual, o que indica
    # que o item ou um de seus filhos está ativo
    if path and (path != settings.BASE_URL + '/') and path.startswith(item.link):
        item.is_current = True

    # Atalho para o objeto que contém as informações do menu
    navmenu = context

    # Adiciona o item ao contexto
    navmenu.update({
        'item': item,
        'child': child,
    })
    
    return template.loader.render_to_string(['%s/navitem.html' % navmenu['template_dir']], context)
